﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Noris.Tools.FrxEditor.Editor;
using Noris.Tools.FrxEditor.Components;
using Noris.Tools.FrxEditor.Data;
using Noris.Schedule.Support;

namespace Noris.Tools.FrxEditor.Forms
{
	/// <summary>
	/// Editor FRX sestavy, celé okno: dokument, toolbar, editor, property grid, status bar
	/// </summary>
	public partial class EditorForm : DForm
	{
		#region Konstrukce
		/// <summary>
		/// Konstruktor
		/// </summary>
		public EditorForm()
		{
			InitializeComponent();
            InitForm();
            InitUI();
            InitEditor();
			InitPropertyGrid();
			InitDocument();
		}
        /// <summary>
        /// Pokračování inicializace formu
        /// </summary>
        protected void InitForm()
        {
            Steward.Diagnostic.InfoClear(true);
            this.FormClosed += new FormClosedEventHandler(EditorForm_FormClosed);
        }

        void EditorForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            Steward.Diagnostic.Save();
            Steward.Diagnostic.Open();
        }
		#endregion
		#region User Interface
        /// <summary>
        /// Inicializace UI
        /// </summary>
		private void InitUI()
        {
            this._EditorUI = new Editor.EditorUI();
            this._EditorUI.CommandExecute += new EditorCommandExecuteHandler(_EditorUI_CommandExecute);
            this._EditorUI.CreateUI(this._ToolStripTop, this._ToolStripLeft, this._ToolStripRight);
        }
        /// <summary>
        /// Objektu UI, který řeší celou logiku UI (tvorbu dle konfigurace, aktivitu, refreshe)
        /// </summary>
        public EditorUI _EditorUI;
        /// <summary>
        /// Metoda, která pomáhá řešit klávesové eventy.
        /// Typický postup: Control, který má focus, dostává od Windows fyzické klávesové eventy.
        /// Aby je nemusel dekódovat sám (protože jejich klávesové zkratky mohou být konfigurovatelné !), využívá tuto metodu UI = předá ji informace o klávesách.
        /// Tato metoda zjistí, zda klávesy odpovídají některému commandu, pokud ano tak tento command provede (vytvoří Command a zavolá standardní event CommandExecute), a vrací se true = byl to příkaz.
        /// Pokud to není příkaz, pak se event nevolá a vrací se false (klávesa je nevyřešena, control si ji může řešit sám).
        /// </summary>
        /// <param name="keyModifiers"></param>
        /// <param name="keyCode"></param>
        /// <returns></returns>
        public bool KeyEventResolve(Keys keyModifiers, Keys keyCode)
        {
            return this._EditorUI.KeyEventResolve(keyModifiers, keyCode);
        }
        /// <summary>
        /// Aktualizuje jednotlivé vizuální prvky (položky menu / toolbaru) podle stavů předaných v parametru této metody.
        /// </summary>
        /// <param name="itemStates"></param>
        public void EditorUIRefresh(IEnumerable<EditorUIItemState> itemStates)
        {
            this._EditorUI.UIRefresh(itemStates);
        }
        /// <summary>
        /// Privátní handler pro událost, kdy na UI došlo k požadavku na akci
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void _EditorUI_CommandExecute(object sender, EditorCommandExecuteArgs args)
        {
            this.Document.RunCommand(args);
        }
        #endregion
        #region Editor
        /// <summary>
        /// Inicializace editoru
        /// </summary>
        protected void InitEditor()
        {
            this._ReportEditor.Initialize();
        }
        #endregion
		#region PropertyGrid
        /// <summary>
        /// Inicializace PropertyGridu
        /// </summary>
		protected void InitPropertyGrid()
		{
            this._PropertyGrid.CommandsVisibleIfAvailable = false;
            this._PropertyGrid.SelectedGridItemChanged += new SelectedGridItemChangedEventHandler(PropertyGrid_SelectedGridItemChanged);
			this._PropertyGrid.PropertyValueChanged += new PropertyValueChangedEventHandler(PropertyGrid_PropertyValueChanged);
		}
		/// <summary>
		/// Po změně aktivního řádku v property gridu
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		void PropertyGrid_SelectedGridItemChanged(object sender, SelectedGridItemChangedEventArgs e)
		{

		}
		/// <summary>
		/// Po změně hodnoty určité vlastnosti v property gridu
		/// </summary>
		/// <param name="s"></param>
		/// <param name="e"></param>
		void PropertyGrid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
		{
            this._ReportEditor.ReDraw();
		}
		#endregion
		#region Document
		/// <summary>
		/// Iniciace dokumentu
		/// </summary>
		protected void InitDocument()
		{
            // Sestava alternativních komponent pro dílec 62271:
            this.Document = ReportDocument.CreateFromFile("dw_testy_tab.srd");
            this.Document.Records = new List<int>() { 62271 };
		}
		/// <summary>
		/// Data FRX dokumentu
		/// </summary>
		public ReportDocument Document
		{
			get
			{
				return this._Document;
			}
			set
			{
				this._Document = value;
				this._ReportEditor.Document = value;
				if (this._Document != null)
				{
                    this._Document.Form = this;
				}
			}
		}
		private ReportDocument _Document;
		#endregion
        #region Public property
        /// <summary>
        /// Objektu UI, který řeší celou logiku UI (tvorbu dle konfigurace, aktivitu, refreshe)
        /// </summary>
        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public EditorUI EditorUI { get { return this._EditorUI; } }
        /// <summary>
        /// Grafický editor
        /// </summary>
        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public EditorControl ReportEditor { get { return this._ReportEditor; } }
        /// <summary>
        /// Property grid
        /// </summary>
        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public PropertyGrid PropertyGrid { get { return this._PropertyGrid; } }
        #endregion
    }
}
